package Divers;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

/**
 * format type :
 *com.inetpsa.cvn.web.actions.configuration.AfficherListeParametreAction=var1;var2;
 *com.inetpsa.cvn.web.actions.ddp.AfficherListeDelaisDeFinancementAction=var3;var1;
 *com.inetpsa.cvn.web.actions.entite.AfficherListeHistoriqueDeviseAction=var4;var5;
 *com.inetpsa.cvn.web.actions.entite.AfficherUneEntiteAdresseAction=var1;var2;
 * @author  : Infotel
 * @version : CVS
 * @since   : 26 mars 09
 */

public class CreerFichierVariableSession {
	/**
	 * @param args
	 */	
	private static final String cheminFichier = "C:\\Documents and Settings\\DACO\\Bureau\\";
	private static final String nomFichier = "session.propertiesBrute";
	private static final String nomFichierSortie= "session.properties";
	
	private static final String nomListeVariables = "session.attributs.list";
	
	public static void main(String[] args) {

		String txtSortie = "";
		String listeVariables = "";	
		String[] modifie = null;
		System.out.println("Debut de programme");
		try {
			String[] txtentree = lireFichier(cheminFichier+nomFichier);
			modifie = txtentree;
			
			//1ier passage pour creer la liste des variables
			listeVariables = creeListeVariables(txtentree);
		
			//2ieme passage pour creer le tableau de lignes packages
			String packages ="";
			for (int i = 0 ; i < txtentree.length ; i++) {
				if(txtentree[i] != null ) {
					if(!txtentree[i].contains("#")) {
						modifie[i] = creerLignePackage(txtentree[i], listeVariables);
					}
				}
			}
			//linearisation du tableau de ligne pacjages
			for (int i = 0 ; i < modifie.length ; i++) {
				if(modifie[i] != null) {
					packages +=modifie[i]+"\n"; 
				}
			}
			
			txtSortie += nomListeVariables +"="+listeVariables;
			txtSortie += "\n\r";
			txtSortie += packages;
			
			ecrirerFichier(cheminFichier+nomFichierSortie,txtSortie);		
			
		} catch (Exception e) {
			System.out.println("ERREUR : " + e.getMessage() +", "+e.toString());
		}
		System.out.println("Fin de programme");
		
	}
	
	private static String creerLignePackage(String ligne, String listeVariables) throws Exception{
		String newLigne ="";
		try {
			String[] tabLigne = recupereNomDonnee(ligne);
			String[] newTabLigne = new String[listeVariables.split(";").length];
			tabLigne = recupereNomDonnee(ligne);
			newTabLigne = new String[listeVariables.split(";").length];
			newLigne =tabLigne[0]+"=";
			for (int i = 0 ; i < newTabLigne.length ; i++) {
				newTabLigne[i]="O";
			}
			for (int j = 1 ; j < tabLigne.length ; j++) {
				int numeroVariable = numeroVariable(tabLigne[j], listeVariables);
				newTabLigne[numeroVariable] = "N";
			}
			for (int i = 0 ; i < newTabLigne.length ; i++) {
				newLigne += newTabLigne[i]+";";
			}
		} catch (Exception e) {
			throw e;
		}
	    return newLigne;
	}
	
	private static String creeListeVariables(String[]  texte) throws Exception{
		String[] ligne = null;
		String variables = "";
		try {
			for (int i = 0 ; i < texte.length ; i++) {
				if(texte[i]!= null) {
					ligne = recupereNomDonnee(texte[i]);
				}
				for (int j = 1 ; j < ligne.length ; j++) {
					if(!dejaPresent(ligne[j], variables) ) {
						variables += ligne[j] +";";
					}
				}
			}
		} catch (Exception e) {
			throw e;
		}
	    return variables;
	}
	
	private static String[] recupereNomDonnee(String  texte){
		texte = texte.replace("=", ";");
		return texte.split(";");
	}
	
	/**
	 *  regarde si la variable est deja presente dans la liste
	 * @param Variable
	 * @param listeVariables
	 * @return
	 * @throws Exception
	 */
	private static boolean dejaPresent(String  Variable, String listeVariables) throws Exception{
		boolean resultat = false;
		try {
			String[] tabListeVariables = listeVariables.split(";");
			for (int i = 0 ; i < tabListeVariables.length ; i++) {
				if( Variable.equals(tabListeVariables[i]) ) {
					resultat = true;
				}
			}
		} catch (Exception e) {
			throw e;
		}
		return resultat;
	}
	
	/**
	 * indique le numero d'emplacemement de la variable dans la liste
	 * @param Variable
	 * @param listeVariables
	 * @return
	 * @throws Exception
	 */
	private static Integer numeroVariable(String Variable, String listeVariables) throws Exception{
		Integer resultat = 0;
		try {
			String[] tabListeVariables = listeVariables.split(";");
			for (int i = 0 ; i < tabListeVariables.length ; i++) {
				if( Variable.equals(tabListeVariables[i]) ) {
					resultat = i;
				}
			}
		} catch (Exception e) {
			throw e;
		}

		return resultat;
	}
	
	/** lecture du fichier 
	 * @param cheminFichier = path + nomFichier
	 * @return String[]
	 * @throws Exception
	 */
	private static String[] lireFichier(String  cheminFichier) throws Exception{
	    String[] txt = new String[500];
		InputStreamReader flog	= null;
		LineNumberReader llog	= null;
		String myLine		     = null;
		try{ 
			flog = new InputStreamReader(new FileInputStream(cheminFichier) );
			llog = new LineNumberReader(flog);
			int i = 0;
			while ((myLine = llog.readLine()) != null) { 
				txt[i] = myLine;
				i++;
	        }
        }catch (Exception e){
			throw e;
        }

	    return txt;
	}
	
	/** ecriture du fichier 
	 * @param cheminFichier
	 * @param donnee
	 * @return
	 * @throws Exception
	 */
	private static boolean ecrirerFichier(String  cheminFichier, String donnee) throws Exception{
		//methode brute on efface le fichier puis on le recree
		FileWriter writer = null;
		try{
			try {
				File MyFile = new File(cheminFichier);
				MyFile.delete(); 
			} catch (Exception e) {
				throw e;
			}	
			
		     writer = new FileWriter(cheminFichier, true);
		     writer.write(donnee,0,donnee.length());
		}catch(IOException e){
			throw e;
		}finally{
		  if(writer != null){
		     try {
				writer.close();
			} catch (IOException e) {
				throw e;				
			}
		  }
		}
		return true;
	}
	
}



